﻿using System.Reflection;

namespace System.Linq.Reactive
{
    /// <summary>Объект-наблюдатель за указанным событием</summary>
    /// <typeparam name="T">Тип объектов последовательности</typeparam>
    class EventObservableEx<T> : IObservableEx<T>
                where T : EventArgs
    {
        /// <summary>Объект, за событием которого происходит наблюдение</summary>
        private readonly object f_Obj;
        /// <summary>Описатель события</summary>
        private readonly EventInfo f_EventDescriptor;

        /// <summary>Объект-наблюдатель за указанным событием</summary>
        /// <param name="Obj">Объект, за событием которого происходит наблюдение</param>
        /// <param name="EventName">Имя события</param>
        public EventObservableEx(object Obj, string EventName)
        {
            var lv_EventDescriptor = Obj.GetType().GetEvent(EventName);
            if(lv_EventDescriptor == null)
                throw new ArgumentException(string.Format("Событие {0} не найдено", EventName), nameof(EventName));
            f_Obj = Obj;
            f_EventDescriptor = lv_EventDescriptor;
        }

        /// <summary>Метод получения наблюдателя</summary>
        /// <returns>Наблюдатель за событием</returns>
        public IObserverEx<T> GetObserver()
        {
            var observer = new SimpleObserverEx<T>();
            f_EventDescriptor.AddEventHandler(f_Obj, new EventHandler<T>((sender, args) => observer.OnNext(args)));
            return observer;
        }
    }
}